/*
* DrakkarKeel - An Enterprise Collaborative Search Platform
*
* The contents of this file are subject under the terms described in the
* DRAKKARKEEL_LICENSE file included in this distribution; you may not use this
* file except in compliance with the License.
*
* 2013-2014 DrakkarKeel Platform.
*/
package drakkar.mast.retrieval.parser;
import com.thoughtworks.qdox.JavaDocBuilder;
import com.thoughtworks.qdox.model.DocletTag;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaField;
import com.thoughtworks.qdox.model.JavaMethod;
import com.thoughtworks.qdox.model.JavaPackage;
import com.thoughtworks.qdox.model.JavaSource;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
* Para extraer de una clase Java: nombre de la clase, paquete,
* nombre de los metodos, comentarios, nombre de los atributos, javadocs
*
*/
public class JavaParser {
private JavaDocBuilder builder;
private JavaSource[] src;
private JavaPackage pkg;
private JavaClass[] classesDefinition; //en un file puede haber mas de una clase....
private JavaField[] vars;
//////////////////////////////
private String classPackage, allSource;
private String[] classNames;
private String[] classComments;
private String[] classJavaDocs;
private String[][] classMethodsComments;
private String[][] classMethodJavaDocs;
private String[][] classMethodNames;
private String[][] classVarNames;
private String[][] classVarComments;
private String[][] classVarJavaDocs;
private int classNumber;
private int classVarNumber;
private int classMethodNumber;
public JavaParser() {
builder = new JavaDocBuilder();
}
/**
* Analiza el fichero que puede contener mas de una clase java.
* Extrae el nombre del paquete, y por cada clase su nombre, atributos,
* metodos y comentarios.
* @param f
* @throws IOException
*/
public void AnalyzeDocument(File f) throws IOException {
getBuilder().addSource(new FileReader(f.getCanonicalPath()));
setSrc(getBuilder().getSources());
//Getting all code of the file
allSource = getSrc()[0].getCodeBlock();
//Getting package
if (getSrc()[0].getPackage() != null) {
setPkg(getSrc()[0].getPackage());
setClassPackage(getPkg().getName());
}
//Getting classesnames
if (getSrc()[0].getClasses() != null) {
setClassdef(getSrc()[0].getClasses());
setClassNumber(getClassdef().length);
classNames = new String[classesDefinition.length];
classVarNames = new String[classesDefinition.length][];
setClassVarComments(new String[classesDefinition.length][]);
classMethodNames = new String[classesDefinition.length][];
classMethodsComments = new String[classesDefinition.length][];
classComments = new String[classesDefinition.length];
setClassJavaDocs(new String[classesDefinition.length]);
for (int i = 0; i < classesDefinition.length; i++) {
JavaClass jclass = classesDefinition[i];
classNames[i] = jclass.getName();
//Getting variables
if (jclass.getFields() != null) {
vars = jclass.getFields();
setClassVariableNumber(vars.length);
classVarNames = new String[classesDefinition.length][vars.length];
setClassVarComments(new String[classesDefinition.length][vars.length]);
for (int j = 0; j < vars.length; j++) {
JavaField jfield = vars[j];
classVarNames[i][j] = jfield.getName();
classVarJavaDocs = new String[classesDefinition.length][vars.length];
if (jfield.getComment() != null) {
getClassVarComments()[i][j] = jfield.getComment();
}
if (jfield.getTags().length != 0) {
String value = "", name = "", line = "";
DocletTag[] doclet = jfield.getTags();
if (doclet.length != 0) {
for (DocletTag docletTag : doclet) {
name = docletTag.getName();
value = docletTag.getValue();
line += name + " " + value + " ";
}
classVarJavaDocs[i][j] = line;
}
}
}
}
//Getting methods
if (jclass.getMethods() != null) {
JavaMethod[] jmethod = jclass.getMethods();
setClassMethodNumber(jmethod.length);
classMethodNames = new String[classesDefinition.length][jmethod.length];
for (int k = 0; k < jmethod.length; k++) {
JavaMethod javaMethod = jmethod[k];
classMethodNames[i][k] = javaMethod.getName();
classMethodJavaDocs = new String[classesDefinition.length][jmethod.length];
classMethodsComments = new String[classesDefinition.length][jmethod.length];//duda
if (javaMethod.getComment() != null) {
classMethodsComments[i][k] = javaMethod.getComment();
}
if (javaMethod.getTags().length != 0) {
String value = "", name = "", line = "";
DocletTag[] doclet = javaMethod.getTags();
for (DocletTag docletTag : doclet) {
name = docletTag.getName();
value = docletTag.getValue();
line += name + " " + value + " ";
}
classMethodJavaDocs[i][k] = line;
}
}
}
//Getting comments
if (jclass.getComment() != null) {
classComments[i] = jclass.getComment();
}
//Getting class javadocs
if (jclass.getTags().length != 0) {
String value = "", name = "", line = "";
DocletTag[] doclet = jclass.getTags();
for (DocletTag docletTag : doclet) {
name = docletTag.getName();
value = docletTag.getValue();
line += name + " " + value + " ";
}
getClassJavaDocs()[i] = line;
}
}
}
}
/**
* Obtener el nombre de la clase
* @param i
* @return
*/
public String getClassesNames(int i) {
return classNames[i];
}
/**
* Obtener el comentario de la clase
* @param i
* @return
*/
public String getClassesComments(int i) {
return classComments[i];
}
/**
* Obtener el javadocs de la clase
* @param i
* @return
*/
public String getClassesJDocs(int i) {
return classJavaDocs[i];
}
/**
* Obtener la cantidad de variables que existen por clase
* @param i
* @return
*/
public int getClassVariableNumber(int i) {
return classVarNames[i].length;
}
/**
* Obtener los nombres de las variables
* @param i
* @param j
* @return
*/
public String getClassesVarName(int i, int j) {
return classVarNames[i][j];
}
/**
* Obtener la cantidad de métodos por clase
* @param i
* @return
*/
public int getClassesMethods(int i) {
return classMethodNames[i].length;
}
/**
* Obtener los nombres de cada metodo por clase
* @param i
* @param j
* @return
*/
public String getClassesMethodsName(int i, int j) {
return classMethodNames[i][j];
}
/**
* Obtener el comentario de un metodo de la clase
* @param i
* @param j
* @return
*/
public String getClassesMethodComment(int i, int j) {
return classMethodsComments[i][j];
}
/**
* Obtener el javadocs de un metodo de la clase
* @param i
* @param j
* @return
*/
public String getClassesMethodJDocs(int i, int j) {
return classMethodJavaDocs[i][j];
}
/**
* Obtener el comentario de una variable de la clase
* @param i
* @param j
* @return
*/
public String getClassesCommentVariables(int i, int j) {
return this.classVarComments[i][j];
}
/**
* Obtener el javadocs de una variable de la clase
* @param i
* @param j
* @return
*/
public String getVariablesJDocs(int i, int j) {
return this.classVarJavaDocs[i][j];
}
//////////////////////////////Methods SET Y GET
/**
* @return the builder
*/
public JavaDocBuilder getBuilder() {
return builder;
}
/**
* @param builder the builder to set
*/
public void setBuilder(JavaDocBuilder builder) {
this.builder = builder;
}
/**
* @return the src
*/
public JavaSource[] getSrc() {
return src;
}
/**
* @param src the src to set
*/
public void setSrc(JavaSource[] src) {
this.src = src;
}
/**
* @return the pkg
*/
public JavaPackage getPkg() {
return pkg;
}
/**
* @param pkg the pkg to set
*/
public void setPkg(JavaPackage pkg) {
this.pkg = pkg;
}
/**
* @return the classPackage
*/
public String getClassPackage() {
return classPackage;
}
/**
* @param classPackage the classPackage to set
*/
public void setClassPackage(String classPackage) {
this.classPackage = classPackage;
}
/**
* @return the classNames
*/
public String[] getClassNames() {
return classNames;
}
/**
* @param classNames the classNames to set
*/
public void setClassNames(String[] classNames) {
this.classNames = classNames;
}
/**
* @return the classComments
*/
public String[] getClassComments() {
return classComments;
}
/**
* @param classComments the classComments to set
*/
public void setClassComments(String[] classComments) {
this.classComments = classComments;
}
/**
* @return the methodNames
*/
public String[][] getMethodNames() {
return classMethodNames;
}
/**
* @param methodNames the methodNames to set
*/
public void setMethodNames(String[][] methodNames) {
this.classMethodNames = methodNames;
}
/**
* @return the classVarNames
*/
public String[][] getClassVarNames() {
return classVarNames;
}
/**
* @param classVarNames the classVarNames to set
*/
public void setClassVarNames(String[][] classVarNames) {
this.classVarNames = classVarNames;
}
/**
* @return the classdef
*/
public JavaClass[] getClassdef() {
return classesDefinition;
}
/**
* @param classdef the classdef to set
*/
public void setClassdef(JavaClass[] classdef) {
this.classesDefinition = classdef;
}
/**
* @return the classNumber
*/
public int getClassNumber() {
return classNumber;
}
/**
* @param classNumber the classNumber to set
*/
public void setClassNumber(int classNumber) {
this.classNumber = classNumber;
}
/**
* @return the classVariableNumber
*/
public int getClassVariableNumber() {
return classVarNumber;
}
/**
* @param classVariableNumber the classVariableNumber to set
*/
public void setClassVariableNumber(int classVariableNumber) {
this.classVarNumber = classVariableNumber;
}
/**
* @return the classMethodNumber
*/
public int getClassMethodNumber() {
return classMethodNumber;
}
/**
* @param classMethodNumber the classMethodNumber to set
*/
public void setClassMethodNumber(int classMethodNumber) {
this.classMethodNumber = classMethodNumber;
}
/**
* @return the classMethodsComments
*/
public String[][] getClassMethodsComments() {
return classMethodsComments;
}
/**
* @param classMethodsComments the classMethodsComments to set
*/
public void setClassMethodsComments(String[][] classMethodsComments) {
this.classMethodsComments = classMethodsComments;
}
/**
* @return the allSource
*/
public String getAllSource() {
return allSource;
}
/**
* @param allSource the allSource to set
*/
public void setAllSource(String allSource) {
this.allSource = allSource;
}
/**
* @return the classVarComments
*/
public String[][] getClassVarComments() {
return classVarComments;
}
/**
* @param classVarComments the classVarComments to set
*/
public void setClassVarComments(String[][] classVarComments) {
this.classVarComments = classVarComments;
}
/**
* @return the classJavaDocs
*/
public String[] getClassJavaDocs() {
return classJavaDocs;
}
/**
* @param classJavaDocs the classJavaDocs to set
*/
public void setClassJavaDocs(String[] classJavaDocs) {
this.classJavaDocs = classJavaDocs;
}
/**
* @return the classMethodsJavaDocs
*/
public String[][] getClassMethodsJavaDocs() {
return classMethodJavaDocs;
}
/**
* @param classMethodsJavaDocs the classMethodsJavaDocs to set
*/
public void setClassMethodsJavaDocs(String[][] classMethodsJavaDocs) {
this.classMethodJavaDocs = classMethodsJavaDocs;
}
/**
* @return the classVarJavaDocs
*/
public String[][] getClassVarJavaDocs() {
return classVarJavaDocs;
}
/**
* @param classVarJavaDocs the classVarJavaDocs to set
*/
public void setClassVarJavaDocs(String[][] classVarJavaDocs) {
this.classVarJavaDocs = classVarJavaDocs;
}
}